package com.zhoug.common.filters;

import android.text.Editable;
import android.widget.EditText;

import com.zhoug.common.utils.LogUtils;

/**
 * EditText输入分段格式化
 * eg:xxxx xxxx xxxx xxxx 每4个字符用一个空格分割
 *
 * @Author: zhoug
 * @Date: 2023/8/17
 * @Description:
 */
public class EditTextDivisionFormat {
    private static boolean DEBUG = true;
    private static final String TAG = ">>>EditTextDivisionFormat";

    /**
     * 分割符
     */
    private char separator = ' ';
    /**
     * 每几个字符插入一个分割符 小于等于0不插入分隔符
     */
    private int divisionNum = 4;
    /**
     * 最大输入字符数 小于等于0不限制
     */
    private int maxLength = 0;

    /**
     * @param view
     * @param text
     * @return 是否改变了数据 如果要在afterTextChanged中获取实时数据的数据需要在返回值为false时获取
     * <p>
     * eg:
     * public void afterTextChanged(Editable s) {
     * boolean change = mEditTextDivisionFormat.afterTextChanged(mEtDivision, s);
     * if(!change){
     * mTvDivision.setText(mEditTextDivisionFormat.getContent(s));
     * }
     * }
     */
    public boolean afterTextChanged(EditText view, String text) {
        if (divisionNum <= 0 || view == null || text == null || text.length() == 0) return false;
        String formatText = format(text);
        if (formatText != null && !formatText.equals(text)) {
            int selectionEnd = view.getSelectionEnd();
            if (DEBUG) {
                LogUtils.d(TAG, "afterTextChanged:setText");
            }
            view.setText(formatText);
            if (selectionEnd < 0) {
                view.setSelection(0);
            } else if (selectionEnd >= text.length()) {
                view.setSelection(formatText.length());
            } else {
                view.setSelection(selectionEnd);
            }
            return true;
        }
        return false;
    }

    public boolean afterTextChanged(EditText view, Editable editable) {
        return afterTextChanged(view, editable != null ? editable.toString() : null);
    }


    /**
     * 根据{@link #separator}和{@link #divisionNum}格式化字符串
     *
     * @param text
     * @return
     */
    public String format(String text) {
        //不做处理
        if (divisionNum <= 0 || text == null || text.length() == 0) return text;
        StringBuilder sb = new StringBuilder();
        //1.取出所有字符，去掉分隔符
        for (int i = 0; i < text.length(); i++) {
            //如果大于等于最大限制字符数,去掉后面的
            if (maxLength > 0 && sb.length() >= maxLength) {
                break;
            }
            if (text.charAt(i) != separator) {
                sb.append(text.charAt(i));
            }
        }
        if (sb.length() > divisionNum) {
            //1234 1234 1234 1234 1234
            //4 9 14 19
            //
            for (int i = divisionNum; i < sb.length(); i += divisionNum + 1) {
                sb.insert(i, separator);
            }
        }
        //3.返回格式化的文本
        String formatText = sb.toString();
        if (DEBUG) {
            LogUtils.d(TAG, "format:formatText=" + formatText);
        }
        return formatText;
    }


    /**
     * 去格式化
     *
     * @param formatText 需要取格式化的字符串
     * @param trim       是否去掉两头的空格
     * @return
     */
    public String getContent(String formatText, boolean trim) {
        if (formatText == null || formatText.length() == 0) return formatText;
        if (trim) {
            formatText = formatText.trim();
        }
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < formatText.length(); i++) {
            if (formatText.charAt(i) != separator) {
                sb.append(formatText.charAt(i));
            }
        }
        String text = sb.toString();
       /* if (DEBUG) {
            LogUtils.d(TAG, "getContent:" + text);
        }*/
        return text;
    }
    /**
     * 去格式化
     *
     * @param editable 需要去格式化
     * @param trim       是否去掉两头的空格
     * @return
     */
    public String getContent(Editable editable, boolean trim) {
        return getContent(editable != null ? editable.toString() : null, trim);
    }


    /**
     * 去格式化,默认去掉两头的空格
     *
     * @param formatText
     * @return
     */
    public String getContent(String formatText) {
        return getContent(formatText, true);
    }

    /**
     * 去格式化,去掉空格
     *默认去掉两头的空格
     * @param editable
     * @return
     */
    public String getContent(Editable editable) {
        return getContent(editable, true);
    }


    /**
     * 设置分割符
     *
     * @param separator
     */
    public void setSeparator(char separator) {
        this.separator = separator;
    }

    /**
     * 每几个字符插入一个分割符
     *
     * @param divisionNum
     */
    public void setDivisionNum(int divisionNum) {
        this.divisionNum = divisionNum;
    }

    public void setMaxLength(int maxLength) {
        this.maxLength = maxLength;
    }
}
